package com.cencat.order.domain;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 配送跟踪信息实体类
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_delivery")
public class Delivery implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 配送ID
     */
    @TableId(value = "delivery_id", type = IdType.AUTO)
    private Long deliveryId;

    /**
     * 配送编号
     */
    @NotBlank(message = "配送编号不能为空")
    @Size(max = 50, message = "配送编号长度不能超过50个字符")
    @TableField("delivery_code")
    private String deliveryCode;

    /**
     * 订单ID
     */
    @NotNull(message = "订单ID不能为空")
    @TableField("order_id")
    private Long orderId;

    /**
     * 订单编号
     */
    @NotBlank(message = "订单编号不能为空")
    @Size(max = 50, message = "订单编号长度不能超过50个字符")
    @TableField("order_code")
    private String orderCode;

    /**
     * 派单ID
     */
    @TableField("dispatch_id")
    private Long dispatchId;

    /**
     * 派单编号
     */
    @Size(max = 50, message = "派单编号长度不能超过50个字符")
    @TableField("dispatch_code")
    private String dispatchCode;

    /**
     * 路线ID
     */
    @TableField("route_id")
    private Long routeId;

    /**
     * 路线编号
     */
    @Size(max = 50, message = "路线编号长度不能超过50个字符")
    @TableField("route_code")
    private String routeCode;

    /**
     * 司机ID
     */
    @NotNull(message = "司机ID不能为空")
    @TableField("driver_id")
    private Long driverId;

    /**
     * 司机编号
     */
    @NotBlank(message = "司机编号不能为空")
    @Size(max = 50, message = "司机编号长度不能超过50个字符")
    @TableField("driver_code")
    private String driverCode;

    /**
     * 司机姓名
     */
    @NotBlank(message = "司机姓名不能为空")
    @Size(max = 50, message = "司机姓名长度不能超过50个字符")
    @TableField("driver_name")
    private String driverName;

    /**
     * 司机手机号
     */
    @NotBlank(message = "司机手机号不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    @TableField("driver_phone")
    private String driverPhone;

    /**
     * 车辆ID
     */
    @TableField("vehicle_id")
    private Long vehicleId;

    /**
     * 车牌号
     */
    @Size(max = 20, message = "车牌号长度不能超过20个字符")
    @TableField("vehicle_plate")
    private String vehiclePlate;

    /**
     * 商家ID
     */
    @TableField("merchant_id")
    private Long merchantId;

    /**
     * 商家名称
     */
    @Size(max = 100, message = "商家名称长度不能超过100个字符")
    @TableField("merchant_name")
    private String merchantName;

    /**
     * 配送状态(0-待接单 1-已接单 2-开始配送 3-到达取货点 4-完成取货 5-配送中 6-到达配送点 7-配送完成 8-异常 9-取消)
     */
    @NotNull(message = "配送状态不能为空")
    @TableField("delivery_status")
    private Integer deliveryStatus;

    /**
     * 配送类型(1-普通配送 2-加急配送 3-定时配送 4-预约配送)
     */
    @NotNull(message = "配送类型不能为空")
    @TableField("delivery_type")
    private Integer deliveryType;

    /**
     * 优先级(1-低 2-中 3-高 4-紧急)
     */
    @Min(value = 1, message = "优先级不能小于1")
    @Max(value = 4, message = "优先级不能大于4")
    @TableField("priority")
    private Integer priority;

    /**
     * 货物重量(公斤)
     */
    @DecimalMin(value = "0.0", message = "货物重量不能小于0")
    @TableField("cargo_weight")
    private BigDecimal cargoWeight;

    /**
     * 货物体积(立方米)
     */
    @DecimalMin(value = "0.0", message = "货物体积不能小于0")
    @TableField("cargo_volume")
    private BigDecimal cargoVolume;

    /**
     * 货物类型
     */
    @Size(max = 100, message = "货物类型长度不能超过100个字符")
    @TableField("cargo_type")
    private String cargoType;

    /**
     * 货物描述
     */
    @Size(max = 500, message = "货物描述长度不能超过500个字符")
    @TableField("cargo_desc")
    private String cargoDesc;

    /**
     * 货物数量
     */
    @Min(value = 1, message = "货物数量不能小于1")
    @TableField("cargo_quantity")
    private Integer cargoQuantity;

    /**
     * 货物单位
     */
    @Size(max = 20, message = "货物单位长度不能超过20个字符")
    @TableField("cargo_unit")
    private String cargoUnit;

    /**
     * 货物价值
     */
    @DecimalMin(value = "0.0", message = "货物价值不能小于0")
    @TableField("cargo_value")
    private BigDecimal cargoValue;

    /**
     * 特殊要求
     */
    @Size(max = 500, message = "特殊要求长度不能超过500个字符")
    @TableField("special_requirements")
    private String specialRequirements;

    /**
     * 取货地址
     */
    @NotBlank(message = "取货地址不能为空")
    @Size(max = 200, message = "取货地址长度不能超过200个字符")
    @TableField("pickup_address")
    private String pickupAddress;

    /**
     * 取货联系人
     */
    @NotBlank(message = "取货联系人不能为空")
    @Size(max = 50, message = "取货联系人长度不能超过50个字符")
    @TableField("pickup_contact")
    private String pickupContact;

    /**
     * 取货联系电话
     */
    @NotBlank(message = "取货联系电话不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "取货联系电话格式不正确")
    @TableField("pickup_phone")
    private String pickupPhone;

    /**
     * 取货纬度
     */
    @DecimalMin(value = "-90.0", message = "纬度范围不正确")
    @DecimalMax(value = "90.0", message = "纬度范围不正确")
    @TableField("pickup_latitude")
    private BigDecimal pickupLatitude;

    /**
     * 取货经度
     */
    @DecimalMin(value = "-180.0", message = "经度范围不正确")
    @DecimalMax(value = "180.0", message = "经度范围不正确")
    @TableField("pickup_longitude")
    private BigDecimal pickupLongitude;

    /**
     * 配送地址
     */
    @NotBlank(message = "配送地址不能为空")
    @Size(max = 200, message = "配送地址长度不能超过200个字符")
    @TableField("delivery_address")
    private String deliveryAddress;

    /**
     * 配送联系人
     */
    @NotBlank(message = "配送联系人不能为空")
    @Size(max = 50, message = "配送联系人长度不能超过50个字符")
    @TableField("delivery_contact")
    private String deliveryContact;

    /**
     * 配送联系电话
     */
    @NotBlank(message = "配送联系电话不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "配送联系电话格式不正确")
    @TableField("delivery_phone")
    private String deliveryPhone;

    /**
     * 配送纬度
     */
    @DecimalMin(value = "-90.0", message = "纬度范围不正确")
    @DecimalMax(value = "90.0", message = "纬度范围不正确")
    @TableField("delivery_latitude")
    private BigDecimal deliveryLatitude;

    /**
     * 配送经度
     */
    @DecimalMin(value = "-180.0", message = "经度范围不正确")
    @DecimalMax(value = "180.0", message = "经度范围不正确")
    @TableField("delivery_longitude")
    private BigDecimal deliveryLongitude;

    /**
     * 当前纬度
     */
    @DecimalMin(value = "-90.0", message = "纬度范围不正确")
    @DecimalMax(value = "90.0", message = "纬度范围不正确")
    @TableField("current_latitude")
    private BigDecimal currentLatitude;

    /**
     * 当前经度
     */
    @DecimalMin(value = "-180.0", message = "经度范围不正确")
    @DecimalMax(value = "180.0", message = "经度范围不正确")
    @TableField("current_longitude")
    private BigDecimal currentLongitude;

    /**
     * 位置更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("location_update_time")
    private LocalDateTime locationUpdateTime;

    /**
     * 预计距离(公里)
     */
    @DecimalMin(value = "0.0", message = "预计距离不能小于0")
    @TableField("estimated_distance")
    private BigDecimal estimatedDistance;

    /**
     * 实际距离(公里)
     */
    @DecimalMin(value = "0.0", message = "实际距离不能小于0")
    @TableField("actual_distance")
    private BigDecimal actualDistance;

    /**
     * 预计时长(分钟)
     */
    @Min(value = 0, message = "预计时长不能小于0")
    @TableField("estimated_duration")
    private Integer estimatedDuration;

    /**
     * 实际时长(分钟)
     */
    @Min(value = 0, message = "实际时长不能小于0")
    @TableField("actual_duration")
    private Integer actualDuration;

    /**
     * 配送费用
     */
    @DecimalMin(value = "0.0", message = "配送费用不能小于0")
    @TableField("delivery_fee")
    private BigDecimal deliveryFee;

    /**
     * 燃油费
     */
    @DecimalMin(value = "0.0", message = "燃油费不能小于0")
    @TableField("fuel_fee")
    private BigDecimal fuelFee;

    /**
     * 过路费
     */
    @DecimalMin(value = "0.0", message = "过路费不能小于0")
    @TableField("toll_fee")
    private BigDecimal tollFee;

    /**
     * 其他费用
     */
    @DecimalMin(value = "0.0", message = "其他费用不能小于0")
    @TableField("other_fee")
    private BigDecimal otherFee;

    /**
     * 总费用
     */
    @DecimalMin(value = "0.0", message = "总费用不能小于0")
    @TableField("total_fee")
    private BigDecimal totalFee;

    /**
     * 接单时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("accept_time")
    private LocalDateTime acceptTime;

    /**
     * 开始配送时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("start_delivery_time")
    private LocalDateTime startDeliveryTime;

    /**
     * 到达取货点时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("arrive_pickup_time")
    private LocalDateTime arrivePickupTime;

    /**
     * 完成取货时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("complete_pickup_time")
    private LocalDateTime completePickupTime;

    /**
     * 到达配送点时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("arrive_delivery_time")
    private LocalDateTime arriveDeliveryTime;

    /**
     * 完成配送时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("complete_delivery_time")
    private LocalDateTime completeDeliveryTime;

    /**
     * 要求取货时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("required_pickup_time")
    private LocalDateTime requiredPickupTime;

    /**
     * 要求送达时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("required_delivery_time")
    private LocalDateTime requiredDeliveryTime;

    /**
     * 取消时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("cancel_time")
    private LocalDateTime cancelTime;

    /**
     * 取消原因
     */
    @Size(max = 200, message = "取消原因长度不能超过200个字符")
    @TableField("cancel_reason")
    private String cancelReason;

    /**
     * 异常时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("exception_time")
    private LocalDateTime exceptionTime;

    /**
     * 异常类型(1-车辆故障 2-交通事故 3-货物损坏 4-联系不上 5-其他)
     */
    @TableField("exception_type")
    private Integer exceptionType;

    /**
     * 异常描述
     */
    @Size(max = 500, message = "异常描述长度不能超过500个字符")
    @TableField("exception_desc")
    private String exceptionDesc;

    /**
     * 异常处理状态(0-未处理 1-处理中 2-已处理)
     */
    @TableField("exception_status")
    private Integer exceptionStatus;

    /**
     * 异常处理人
     */
    @Size(max = 50, message = "异常处理人长度不能超过50个字符")
    @TableField("exception_handler")
    private String exceptionHandler;

    /**
     * 异常处理时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("exception_handle_time")
    private LocalDateTime exceptionHandleTime;

    /**
     * 异常处理结果
     */
    @Size(max = 500, message = "异常处理结果长度不能超过500个字符")
    @TableField("exception_result")
    private String exceptionResult;

    /**
     * 轨迹数据(JSON格式)
     */
    @TableField("track_data")
    private String trackData;

    /**
     * 路径优化建议
     */
    @Size(max = 500, message = "路径优化建议长度不能超过500个字符")
    @TableField("route_optimization")
    private String routeOptimization;

    /**
     * 配送评分
     */
    @DecimalMin(value = "0.0", message = "配送评分不能小于0")
    @DecimalMax(value = "5.0", message = "配送评分不能大于5")
    @TableField("delivery_rating")
    private BigDecimal deliveryRating;

    /**
     * 服务评分
     */
    @DecimalMin(value = "0.0", message = "服务评分不能小于0")
    @DecimalMax(value = "5.0", message = "服务评分不能大于5")
    @TableField("service_rating")
    private BigDecimal serviceRating;

    /**
     * 评价内容
     */
    @Size(max = 500, message = "评价内容长度不能超过500个字符")
    @TableField("rating_content")
    private String ratingContent;

    /**
     * 评价时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("rating_time")
    private LocalDateTime ratingTime;

    /**
     * 评价人
     */
    @Size(max = 50, message = "评价人长度不能超过50个字符")
    @TableField("rating_by")
    private String ratingBy;

    /**
     * 是否准时(0-否 1-是)
     */
    @TableField("is_on_time")
    private Integer isOnTime;

    /**
     * 是否完好(0-否 1-是)
     */
    @TableField("is_intact")
    private Integer isIntact;

    /**
     * 签收人
     */
    @Size(max = 50, message = "签收人长度不能超过50个字符")
    @TableField("recipient")
    private String recipient;

    /**
     * 签收时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("sign_time")
    private LocalDateTime signTime;

    /**
     * 签收图片
     */
    @Size(max = 500, message = "签收图片长度不能超过500个字符")
    @TableField("sign_images")
    private String signImages;

    /**
     * 配送图片
     */
    @Size(max = 500, message = "配送图片长度不能超过500个字符")
    @TableField("delivery_images")
    private String deliveryImages;

    /**
     * 删除标志(0-存在 1-删除)
     */
    @TableLogic
    @TableField("del_flag")
    private Integer delFlag;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    @TableField("remark")
    private String remark;

    /**
     * 创建者
     */
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新者
     */
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 扩展字段1
     */
    @Size(max = 200, message = "扩展字段1长度不能超过200个字符")
    @TableField("ext_field1")
    private String extField1;

    /**
     * 扩展字段2
     */
    @Size(max = 200, message = "扩展字段2长度不能超过200个字符")
    @TableField("ext_field2")
    private String extField2;

    /**
     * 扩展字段3
     */
    @Size(max = 200, message = "扩展字段3长度不能超过200个字符")
    @TableField("ext_field3")
    private String extField3;

    /**
     * 版本号(乐观锁)
     */
    @Version
    @TableField("version")
    private Integer version;
}